package jp.co.neosystem.ar.simple;

import java.io.IOException;
import java.util.List;

import android.hardware.Camera;
import android.view.SurfaceHolder;

/**
 * 
 * @author takakou
 *
 */
public class MySurfaceHolderCallback implements SurfaceHolder.Callback
{
    /** Cameraクラスオブジェクト */
    private Camera camera;

    /**
     * SurfaceView生成時に呼ばれるメソッド
     * 
     * @param holder
     */
    @Override
    public void surfaceCreated(SurfaceHolder holder)
    {
        if (camera == null)
        {
            try
            {
                // Surfaceが生成されるときにカメラを取得
                camera = Camera.open();
            } catch (RuntimeException e)
            {
                e.printStackTrace();
                return;
            }
        }

        try
        {
            // カメラのプレビュー画像の表示先を設定
            camera.setPreviewDisplay(holder);
        } catch (IOException e)
        {
            // 設定に失敗したらカメラを解放
            camera.release();
            camera = null;
            e.printStackTrace();
        }
    }

    /**
     * SurfaceView変更時に呼ばれるメソッド
     * 
     * @param holder
     * @param format
     * @param width
     * @param heifht
     */
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
    {
        if (camera != null)
        {
            // SurfaceViewが変更されたらカメラ映像を停止
            camera.stopPreview();
            // 変更されたSurfaceにあわせてプレビューのサイズを変更
            setPreviewSize(width, height);
            // カメラ映像の表示を開始
            camera.startPreview();
        }
    }

    /**
     * SurfaceView破棄時に呼ばれるメソッド
     * 
     * @param holder
     */
    @Override
    public void surfaceDestroyed(SurfaceHolder holder)
    {
        if (camera != null)
        {
            // SurfaceViewの破棄時にカメラを解放
            camera.stopPreview();
            camera.release();
            camera = null;
        }
    }

    /**
     * カメラ映像のサイズを設定
     * 
     * @param width
     * @param height
     */
    private void setPreviewSize(int width, int height)
    {
        // 端末のカメラがサポートするカメラ映像のサイズをリストで取得
        Camera.Parameters params = camera.getParameters();
        List<Camera.Size> supported = params.getSupportedPreviewSizes();

        if (supported != null)
        {
            for (Camera.Size size : supported)
            {
                // サポートするサイズの中から画面のサイズと同じ、または小さいものを選択
                if (size.width <= width && size.height <= height)
                {
                    params.setPreviewSize(size.width, size.height);
                    camera.setParameters(params);
                    break;
                }
            }
        }
    }
}
